﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;
using BussinessLogicTecnoPez;
using Tecnopez.Globals;
using Microsoft.Practices.EnterpriseLibrary.Validation;

public partial class Modules_Compras_ABMPedidosProveedor : System.Web.UI.Page
{
    const String pedidoViewStateOrdenKey = "ordenPedido";
    const String pedidoViewStateOrdenDireccionKey = "ordenDireccionPedido";

    const String detalleSession = "DETALLE_PEDIDO_PROVEEDOR";
    const String sessionPedidoFromOferta = "sessionPedidoFromOferta";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.Page.IsPostBack)
        {
            SetMode(PageMode.ListMode);
            CargarComboProveedor();

            if (this.Page.Request.QueryString["idOferta"] != null)
            {
                OfertaProveedor.getManager.ClearFilters();
                OfertaProveedor.getManager.AddFilter("IdOferta", GenericManager<OfertaProveedor>.filterOperator.Equals, this.Page.Request.QueryString["idOferta"].ToString());
                OfertaProveedor objOferta = OfertaProveedor.getManager.GetOne();
                cmdNuevo_Click(null, null);
                TPPOferta.ItemSelected = objOferta;
            }
        }

        TPPProveedor.ObjType = typeof(Proveedor);
        TPPTipoMoneda.ObjType = typeof(TipoMoneda);
        TPPInsumo.ObjType = typeof(Insumo);
        TPPOferta.ObjType = typeof(OfertaProveedor);

        if (TPPOferta.ItemSelected != null && Session[sessionPedidoFromOferta] == null)
            CargarPedidoFromOferta();

        InicializarValidadores();
        InicializarGrillas();

        cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/configurar.gif";
        master.Titulo = "Gestión de Pedidos de Proveedores";
        cargarGrilla();
        _lblError.Text = "";
    }

    private void CargarPedidoFromOferta()
    {
        OfertaProveedor objOferta = TPPOferta.ItemSelected as OfertaProveedor;

        if (objOferta == null)
            return;

        TPPProveedor.ItemSelected = objOferta.Proveedor;
        TPPTipoMoneda.ItemSelected = objOferta.TipoMoneda;

        //armo el detalle
        DetallePedidoProveedor objDetalle = new DetallePedidoProveedor();
        try
        {
            foreach (ItemDetalleOfertaProveedor objItem in objOferta.DetalleOfertaProveedor.ItemList)
            {
                objDetalle.add(objItem.Insumo, objItem.Cantidad, objItem.Precio, 0);
            }
            Session[detalleSession] = objDetalle;
            cargarGrillaDetalle();

            CalcularTotal();
        }
        catch (BussinessLogicTecnoPezException exc)
        {
            _lblErrorDetalle.Text = exc.Message;
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
        catch (FormatException exc)
        {
            _lblErrorDetalle.Text = "Error de formato, verifique la información";
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
        catch (Exception exc)
        {
            _lblErrorDetalle.Text = "error: No se pudo realizar la operación";
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
    }

    private void CargarComboProveedor()
    {
        ddlProveedor.DataTextField = "RazonSocial";
        ddlProveedor.DataValueField = "idProveedor";
        ddlProveedor.DataSource = Proveedor.getManager.GetAll();
        ddlProveedor.DataBind();

        ListItem item = new ListItem("Seleccione...", "-1");
        ddlProveedor.Items.Insert(0, item);
    }
    private void InicializarGrillas()
    {
        grdPedidosProveedor.setupGrid<PedidoProveedor>(cargarGrilla, seleccionarPedidoProveedor, null, true, this.ViewState);
        grdPedidosProveedor.PageDataViewOrdenKey = pedidoViewStateOrdenKey;
        grdPedidosProveedor.PageDataViewOrdenDireccionKey = pedidoViewStateOrdenDireccionKey;

        grdDetallePedido.AutoGenerateColumns = false;
        grdDetallePedido.Columns.Clear();

        BoundField objCol;
        objCol = new BoundField();
        objCol.DataField = "Insumo";
        objCol.HeaderText = "Insumo";
        grdDetallePedido.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.DataField = "Cantidad";
        objCol.HeaderText = "Cantidad";
        grdDetallePedido.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.DataField = "Precio";
        objCol.HeaderText = "Precio";
        grdDetallePedido.Columns.Add(objCol);

        ButtonField objColButton = new ButtonField();
        objColButton.ButtonType = ButtonType.Image;
        objColButton.CommandName = "DeleteRow";
        objColButton.HeaderText = "Quitar";
        objColButton.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        grdDetallePedido.Columns.Add(objColButton);

        string[] strKeys = new string[1];
        strKeys[0] = "IdInsumo";
        grdDetallePedido.DataKeyNames = strKeys;
    }

    private void seleccionarPedidoProveedor(int o)
    {
        int IdPedido = int.Parse(grdPedidosProveedor.grdDatosAbmView.DataKeys[o].Value.ToString());
        PedidoProveedor.getManager.ClearFilters();
        PedidoProveedor.getManager.AddFilter("IDPEDIDOPROVEEDOR", GenericManager<PedidoProveedor>.filterOperator.Equals, IdPedido);
        PedidoProveedor objPedido = PedidoProveedor.getManager.GetOne();
        txtID.Text = objPedido.IdPedidoProveedor.ToString();
        TPCFechaCarga.Text = objPedido.Fecha.ToShortDateString();

        TipoEstadoPedidoProveedor objEstado = objPedido.TipoEstadoPedidoProveedor;
        ViewState["estadoPedidoProveedor"] = objEstado;
        txtEstado.Text = objEstado.ToString();

        if (objPedido.TipoEstadoPedidoProveedor.IdTipoEstadoPedidoProveedor != 1)
        {
            cmdEditar.OnClientClick = "alert(\"Solo pueden editarse Pedidos en estado \'Pedido\'\");return false;";
            cmdEliminar.OnClientClick = "alert(\"Solo pueden eliminarse Pedidos en estado \'Pedido\'\");return false;";
        }
        else
        {
            cmdEditar.OnClientClick = "";
            cmdEliminar.OnClientClick = "";
        }

        Empleado objEmpleado = objPedido.Empleado;
        ViewState["Empleado"] = objEmpleado;
        txtEmpleado.Text = objEmpleado.ToString();

        txtTotal.Text = objPedido.Monto.ToString();

        if (objPedido.TipoMoneda != null)
            TPPTipoMoneda.ItemSelected = objPedido.TipoMoneda;
        else
            TPPTipoMoneda.ItemSelected = null;

        if (objPedido.Proveedor != null)
            TPPProveedor.ItemSelected = objPedido.Proveedor;
        else
            TPPProveedor.ItemSelected = null;

        if (objPedido.DetallePedidoProveedor != null)
            Session[detalleSession] = objPedido.DetallePedidoProveedor;
        cargarGrillaDetalle();

        SetMode(PageMode.ViewMode);
    }

    private void cargarGrilla()
    {
        PedidoProveedor.getManager.ClearFilters();
        PedidoProveedor.getManager.ClearOrders();
        PedidoProveedor.getManager.AddFilter("IdPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");

        if (ddlProveedor.SelectedValue != "-1")
            PedidoProveedor.getManager.AddFilter("PROVEEDOR", GenericManager<PedidoProveedor>.filterOperator.Equals, ddlProveedor.SelectedValue);

        if (ViewState[pedidoViewStateOrdenKey] == null)
            PedidoProveedor.getManager.AddOrder("IdPedidoProveedor", GenericManager<PedidoProveedor>.Order.orderDirection.DESC);
        else
            PedidoProveedor.getManager.AddOrder(ViewState[pedidoViewStateOrdenKey].ToString(), (GenericManager<PedidoProveedor>.Order.orderDirection)ViewState[pedidoViewStateOrdenDireccionKey]);

        List<PedidoProveedor> lista = new List<PedidoProveedor>();
        lista = PedidoProveedor.getManager.GetFilter();
        grdPedidosProveedor.grdDatosAbmView.DataSource = lista;
        grdPedidosProveedor.grdDatosAbmView.DataBind();
    }

    private void seleccionarItemDetallePedidoProveedor(int o)
    {
        return;
    }

    private void cargarGrillaDetalle()
    {
        DetallePedidoProveedor lista = (DetallePedidoProveedor)Session[detalleSession];
        if (lista == null)
            grdDetallePedido.DataSource = null;
        else
            grdDetallePedido.DataSource = lista.ItemList;
        grdDetallePedido.DataBind();
    }

    #region "Modos"
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        _lblError.Text = "";
        _lblErrorDetalle.Text = "";
        switch (mode)
        {
            case PageMode.ListMode:
                wzrABM.ActiveStepIndex = 0;
                break;
            case PageMode.NewMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                TPCFechaCarga.Enabled = true;
                TPPProveedor.Enable = true;
                TPPInsumo.Enable = true;
                TPPTipoMoneda.Enable = true;
                txtTotal.ReadOnly = true;
                txtCantidad.ReadOnly = false;
                txtPrecio.ReadOnly = false;
                txtEstado.ReadOnly = true;
                txtEmpleado.ReadOnly = true;
                cmdAgregarDetalle.Enabled = true;
                btnAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                grdDetallePedido.Enabled = true;
                break;
            case PageMode.EditMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                TPCFechaCarga.Enabled = true;
                TPPProveedor.Enable = true;
                TPPInsumo.Enable = true;
                TPPTipoMoneda.Enable = true;
                txtTotal.ReadOnly = true;
                txtCantidad.ReadOnly = false;
                txtPrecio.ReadOnly = false;
                txtEstado.ReadOnly = true;
                txtEmpleado.ReadOnly = true;
                cmdAgregarDetalle.Enabled = true;
                btnAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                grdDetallePedido.Enabled = true;
                break;
            case PageMode.ViewMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                TPCFechaCarga.Enabled = false;
                TPPProveedor.Enable = false;
                TPPInsumo.Enable = false;
                TPPTipoMoneda.Enable = false;
                txtTotal.ReadOnly = true;
                txtCantidad.ReadOnly = true;
                txtPrecio.ReadOnly = true;
                txtEstado.ReadOnly = true;
                txtEmpleado.ReadOnly = true;
                cmdAgregarDetalle.Enabled = false;
                btnAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;
                grdDetallePedido.Enabled = false;
                break;
        }
    }

    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    #endregion
    #region "Validaciones"
    private void InicializarValidadores()
    {
        PPVProveedor.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.PedidoProveedor";
        PPVProveedor.ControlToValidate = "txtID";
        PPVProveedor.PropertyName = "Proveedor";
        PPVProveedor.DisplayMode = ValidationSummaryDisplayMode.List;

        PPVInsumo.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.ItemDetallePedidoProveedor";
        PPVInsumo.ControlToValidate = "txtCantidad";
        PPVInsumo.PropertyName = "Insumo";
        PPVInsumo.DisplayMode = ValidationSummaryDisplayMode.List;
    }
    protected void PPVInsumo_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPPInsumo.ItemSelected == null)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPPInsumo.ItemSelected.ToString();
    }
    protected void PPVProveedor_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPPProveedor.ItemSelected == null)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPPProveedor.ItemSelected.ToString();
    }
    private bool validar(PedidoProveedor objeto)
    {
        ValidationResults v = Validation.Validate<PedidoProveedor>(objeto);
        if (!v.IsValid)
        {
            _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }

    private bool validarItemDetalle(ItemDetallePedidoProveedor objeto)
    {
        ValidationResults v = Validation.Validate<ItemDetallePedidoProveedor>(objeto);
        if (!v.IsValid)
        {
            _lblErrorDetalle.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }
    #endregion
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        txtID.Text = "";
        TPCFechaCarga.Text = DateTime.Today.ToShortDateString();
        TPPProveedor.ItemSelected = null;
        TPPTipoMoneda.ItemSelected = Functions.getMonedaDefault();
        TPPOferta.ItemSelected = null;
        txtTotal.Text = "";

        TipoEstadoPedidoProveedor.getManager.ClearFilters();
        TipoEstadoPedidoProveedor.getManager.AddFilter("IdTipoEstadoPedidoProveedor", BussinessLogicTecnoPez.GenericManager<TipoEstadoPedidoProveedor>.filterOperator.Equals, 1);
        TipoEstadoPedidoProveedor objEstado = TipoEstadoPedidoProveedor.getManager.GetOne();
        if (objEstado != null)
        {
            txtEstado.Text = objEstado.ToString();
            ViewState["estadoPedidoProveedor"] = objEstado;
        }
        else
        {
            txtEstado.Text = "";
            ViewState["estadoPedidoProveedor"] = null;
        }

        Empleado objEmpleado;
        objEmpleado = Functions.getEmpleadoLogueado(this.Page);
        txtEmpleado.Text = objEmpleado.ToString();
        ViewState["Empleado"] = objEmpleado;

        //detalle
        txtCantidad.Text = "";
        txtPrecio.Text = "";
        TPPInsumo.ItemSelected = null;

        Session[detalleSession] = null;
        cargarGrillaDetalle();

        SetMode(PageMode.NewMode);
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            PedidoProveedor objPedido = new PedidoProveedor();
            objPedido.IdPedidoProveedor = int.Parse(txtID.Text.Trim());
            if (PedidoProveedor.getManager.Delete(objPedido) < 1)
                throw PedidoProveedor.getManager.GeneratedException;
            SetMode(PageMode.ListMode);
            cargarGrilla();
        }
        catch (BussinessLogicTecnoPezException ex)
        {
            _lblError.Text = ex.Message;
            Functions.LogError(ex);
        }
        catch (Exception ex)
        {
            _lblError.Text = "No se pudo eliminar el pedido.";
            Functions.LogError(ex);
        }
    }
    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            PedidoProveedor objPedido = new PedidoProveedor();
            objPedido.Empleado = (Empleado)ViewState["Empleado"];
            objPedido.Fecha = Convert.ToDateTime(TPCFechaCarga.Text);
            objPedido.Monto = decimal.Parse(txtTotal.Text.Trim());
            objPedido.TipoEstadoPedidoProveedor = (TipoEstadoPedidoProveedor)ViewState["estadoPedidoProveedor"];

            if (TPPProveedor.ItemSelected != null)
            {
                Proveedor objProveedor = new Proveedor();
                objProveedor = (Proveedor)TPPProveedor.ItemSelected;
                objPedido.Proveedor = objProveedor;
                objProveedor = null;
            }
            if (TPPTipoMoneda.ItemSelected != null)
            {
                TipoMoneda objMoneda = new TipoMoneda();
                objMoneda = (TipoMoneda)TPPTipoMoneda.ItemSelected;
                objPedido.TipoMoneda = objMoneda;
                objMoneda = null;
            }

            objPedido.DetallePedidoProveedor = (DetallePedidoProveedor)Session[detalleSession];

            if (validar(objPedido))
            {
                if (getMode() == PageMode.NewMode)
                {
                    if (PedidoProveedor.getManager.Insert(objPedido) != true)
                    {
                        throw PedidoProveedor.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ListMode);
                    cargarGrilla();
                    Session[detalleSession] = null;
                }
                else
                {
                    objPedido.IdPedidoProveedor = int.Parse(txtID.Text.Trim());
                    if (PedidoProveedor.getManager.Update(objPedido) != true)
                    {
                        throw PedidoProveedor.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ViewMode);
                }
            }
            _lblError.Text = "";
            _lblErrorDetalle.Text = "";
        }
        catch (FormatException exc)
        {
            _lblError.Text = "Error en los tipos de datos.";
            Functions.LogError(exc);
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación.";
            Functions.LogError(exc);
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        Session[detalleSession] = null;
        SetMode(PageMode.ListMode);
    }
    protected void cmdAgregarDetalle_Click(object sender, EventArgs e)
    {
        ItemDetallePedidoProveedor item = new ItemDetallePedidoProveedor();
        try
        {
            item.Insumo = (Insumo)TPPInsumo.ItemSelected;
            item.Cantidad = decimal.Parse(txtCantidad.Text.Trim());
            item.Precio = decimal.Parse(txtPrecio.Text.Trim());

            if (validarItemDetalle(item))
            {
                DetallePedidoProveedor lista = (DetallePedidoProveedor)Session[detalleSession];
                if (lista == null)
                    lista = new DetallePedidoProveedor();
                lista.add(item);
                Session[detalleSession] = lista;

                CalcularTotal();

                cargarGrillaDetalle();

                TPPInsumo.ItemSelected = null;
                txtCantidad.Text = "";
                txtPrecio.Text = "";

                _lblErrorDetalle.Text = "";
            }
        }
        catch (BussinessLogicTecnoPezException exc)
        {
            _lblErrorDetalle.Text = exc.Message;
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
        catch (FormatException exc)
        {
            _lblErrorDetalle.Text = exc.Message;
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
        catch (Exception exc)
        {
            _lblErrorDetalle.Text = "error: No se pudo realizar la operación";
            Functions.LogError(exc);
            SetMode(PageMode.NewMode);
        }
    }

    private void CalcularTotal()
    {
        DetallePedidoProveedor objDetalle = (DetallePedidoProveedor)Session[detalleSession];
        if (objDetalle == null)
        {
            txtTotal.Text = "0";
            return;
        }
        decimal decTotal = 0;
        foreach (ItemDetallePedidoProveedor objItem in objDetalle)
        {
            decTotal += objItem.Precio;
        }
        txtTotal.Text = decTotal.ToString();
    }
    protected void grdDetallePedido_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            DetallePedidoProveedor objDetalle = (DetallePedidoProveedor)Session[detalleSession];
            DetallePedidoProveedor objNewDetalle = new DetallePedidoProveedor();
            try
            {
                if (objDetalle == null)
                    return;

                foreach (ItemDetallePedidoProveedor objItem in objDetalle.ItemList)
                {
                    if (objItem.IdInsumo != int.Parse(grdDetallePedido.DataKeys[int.Parse(e.CommandArgument.ToString())].Value.ToString()))
                    {
                        objNewDetalle.add(objItem);
                    }
                }
                Session[detalleSession] = objNewDetalle;
            }
            catch (Exception ex)
            {
                _lblErrorDetalle.Text = ex.Message;
            }
            finally
            {                
                cargarGrillaDetalle();
                CalcularTotal();
            }
        }
    }
}
